/*
  ******************************************************************************
  *project：  	MOTOR_Control Board Test Project
  *developer：	郑州嵌羚智能科技有限公司 http://emlstech.com/
  *support:		许 (13523443291)
  *data：     	2021-01-26
  *CPU：      	I.M6ULL
  *version:		V1.0
  *comment： 	两IO(GPIO5_IO01 GPIO1_IO03)控制电机转向，GPIO1_IO08控制电机转速
			
				电机从10%占空比启动，缓慢加速至100%，然后停止5s，
				切换转向，由0%占空比启动加速至100%
  ******************************************************************************
*/
#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led.h"
#include "bsp_beep.h"
#include "bsp_key.h"
#include "bsp_int.h"
#include "bsp_uart.h"
#include "bsp_lcd.h"
#include "bsp_lcdapi.h"
#include "bsp_rtc.h"
#include "bsp_backlight.h"
#include "stdio.h"

/*
 * @description	: 使能I.MX6U的硬件NEON和FPU
 * @param 		: 无
 * @return 		: 无
 */
 void imx6ul_hardfpu_enable(void)
{
	uint32_t cpacr;
	uint32_t fpexc;

	/* 使能NEON和FPU */
	cpacr = __get_CPACR();
	cpacr = (cpacr & ~(CPACR_ASEDIS_Msk | CPACR_D32DIS_Msk))
		   |  (3UL << CPACR_cp10_Pos) | (3UL << CPACR_cp11_Pos);
	__set_CPACR(cpacr);
	fpexc = __get_FPEXC();
	fpexc |= 0x40000000UL;	
	__set_FPEXC(fpexc);
}

/*
 * @description	: main函数
 * @param 		: 无
 * @return 		: 无
 */
int main(void)
{
	unsigned char keyvalue = 0;
	unsigned char i = 0;
	unsigned char state = OFF;
	unsigned char duty = 0;
	
	imx6ul_hardfpu_enable();	/* 使能I.MX6U的硬件浮点			*/
	int_init(); 				/* 初始化中断(一定要最先调用！) */
	imx6u_clkinit();			/* 初始化系统时钟				*/
	delay_init();				/* 初始化延时 					*/
	clk_enable();				/* 使能所有的时钟				*/
	motor_gpio_init();			/* 初始化motor gpio				*/

	uart_init();				/* 初始化串口，波特率115200 	*/
	lcd_init();	
	backlight_init();			/* 初始化背光PWM				*/ 

	motor_gpio_switch(S_INT1, ON);		/*正转*/
	motor_gpio_switch(S_INT2, OFF);
	/* 设置默认占空比 10% */
	duty = 10;
	pwm1_setduty(duty);	
	
	while(1)
	{
		duty += 1;				/* 占空比加10% */
		if(duty > 100)			/* 如果占空比超过100%，重新从10%开始 */
		{
			duty = 0;
			pwm1_setduty(duty);	
			delayms(1000);delayms(1000);delayms(1000);delayms(1000);delayms(1000);
			if(i == 0)
			{
				i = 1;
				motor_gpio_switch(S_INT1, OFF);		/*反转*/
				motor_gpio_switch(S_INT2, ON);
			}
			else
			{
				i = 0;
				motor_gpio_switch(S_INT1, ON);		/*正转*/
				motor_gpio_switch(S_INT2, OFF);				
			}
			
		}
		pwm1_setduty(duty);		/* 设置占空比 */

		delayms(100);
	}
	return 0;
}
